package com.dk.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: Eayon
 * @time: 2020/6/3 14:25
 * @version: 1.0.0
 * @description:  多数据源配置类
 */
@Configuration
public class DataSourceConfig {

    /**
     * 主库数据源配置 master
     * @return
     */
    @Bean
    @ConfigurationProperties("spring.datasource.druid.ds-master")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 从库数据源配置 slave
     * @return
     */
    @Bean
    @ConfigurationProperties("spring.datasource.druid.ds-slave")
    public DataSource slaveDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 动态数据源
     * @return
     */
    @Bean
    @Primary//如果有相同bean的话 加上此注解会优先执行   这里表示优先通过动态数据源配置去动态获取数据源
    //以为该bean需要masterDataSource、slaveDataSource这两个bean，所以为了防止该bean比这俩先生成造成异常，所以加上该注解
    //必须要加 参数就是限制比那几个方法名创建的晚的意思
    @DependsOn({"masterDataSource","slaveDataSource"})
    public DynamicDataSource dynamicDataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("ds-master", masterDataSource());
        targetDataSources.put("ds-slave", slaveDataSource());
        //将主库和从库的数据源 / 默认数据源（主库） 配置给动态数据源配置类
        return new DynamicDataSource(targetDataSources, masterDataSource());
    }

}
